package com.flower.algorithm.linklist;

/**
 * @ClassName LinkListSolution
 * @Description 链表算法实现
 * @Author 吃麻椒的花酱
 * @Date 2021/10/27 11:09
 * @Version 1.0
 */
public class LinkListSolution {
    ListNode listNode= new ListNode(0);

    // 尾插法建立单链表
    public void createListR(ListNode node){
        ListNode temp=listNode;
        while (temp .next!= null) {
            temp=temp.next;
        }
        temp.next = node;
    }

    // 修改单链表指定节点的数据
    public void editNode(int number,int newValue){
        if(listNode==null||listNode.next == null){
            return;
        }
        ListNode temp=listNode.next;
        while(temp!=null){
            if(temp.val==number){
                temp.val=newValue;
                break;
            }
            temp=temp.next;
        }
    }

    // 删除指定位置的链表 删除需要前后两个指针维护 也可以一个
   /** ListNode temp = listNode.next;
      while (temp != null) {
          if(temp.val == number){
            temporary.next=temp.next;
            break;
          }
          temp=temp.next;
          temporary=temporary.next;
      }*/
    public void deleteNode(int number){
        if (listNode == null || listNode.next == null) {
            return;
        }
        ListNode temp=listNode;
        while (temp.next != null)
        {
            if (temp.next.val == number) {
                temp.next = temp.next.next;
                break;
            }
            temp = temp.next;
        }
    }

    // 在指定数据节点的后面添加新的节点
    public void addNode(int number,ListNode newNode){
        if(listNode==null||listNode.next == null){
            return;
        }
        ListNode temp=listNode.next;
        while(temp!=null){
            if(temp.val == number){
                newNode.next = temp.next;
                temp.next = newNode;
                break;
            }
            temp = temp.next;
        }
    }

    // 头插法建立单链表
    public void createListL(ListNode node){
        ListNode temp=listNode;
        node.next = temp.next;
        listNode.next=node;
    }
    // 遍历单链表
    public void showListNode( ){
        if(listNode==null||listNode.next==null)
        {
            return;
        }
        ListNode temp = listNode;
        while (temp.next != null) {
            temp = temp.next;
            System.out.println(temp.val);
        }
    }
    // 求单链表的长度
    public int getLinkListLength(ListNode listNode){
        if (listNode == null || listNode.next == null) {
            return 0;
        }
        int length=0;
        ListNode temp = listNode.next;
        while (temp!=null) {
            length++;
            temp = temp.next;
        }
        return length;
    }

    // 求链表倒数第n个节点
    public ListNode getListNode(ListNode listNode,int index){
        if (listNode == null || listNode.next == null) {
            return null;
        }
        if(index <= 0 || index > getLinkListLength(listNode))
        {
            return null;
        }
        ListNode temp = listNode.next;
        for(int i = 0;i<getLinkListLength(listNode)-index; i++)
        {
            temp = temp.next;
        }
        int count = 0;
        while(count<getLinkListLength(listNode)-index){
            temp = listNode.next;
            count++;
        }
        return temp;
    }
}
